home *** CD-ROM | disk | FTP | other *** search
/ CD Ware Multimedia 1995 May / cd Ware (Juegos) Epimundo.iso / DOS / PRGMMING / M2PROTOS.ZIP / QCPROTO.MOD < prev    next >
Encoding:
Modula Implementation  |  1993-12-26  |  6.1 KB  |  191 lines

  1. (*# call(o_a_copy => off) *)
  2. (*%F _fdata *)
  3. (*# call(seg_name => null) *)
  4. (*%E *)
  5. (*# module(implementation=>on) *)
  6. (*# data(seg_name => null) *)
  7. (*# data(const_assign => on) *)
  8. IMPLEMENTATION MODULE QCproto;
  9.  
  10.                      (* This JPI Modula-2 module is part of *)
  11.  
  12.                       (* QC -- a communications program *)
  13.                              (* by Carl Neiburger *)
  14.                               (* 169 N. 25th St.*)
  15.                           (* San Jose, Calif. 95116 *)
  16.  
  17.                          (* CompuServe No. 72336,2257 *)
  18.  
  19. FROM PathFind IMPORT FileTree, UnFileTree, FilePtr, ParsePath;
  20. FROM Str IMPORT Append, CHARSET, Compare, Concat, Delete, Length, Pos;
  21. FROM QCdisp IMPORT PressKey, PromptForString, QCDef, QCDefPtr, Kermit, BPlus,
  22.      XModem, XModem1K, ZModem, Yes, ProtoNames;
  23. FROM QCkermit IMPORT ReceiveKermit, SendKermit;
  24. FROM QCxm IMPORT SimpleXmProtos, ReceiveXmodem, SendXmodem;
  25. FROM QCzm IMPORT ReceiveZmodem, SendZmodem;
  26. IMPORT NFIO;
  27. FROM Storage IMPORT DEALLOCATE;
  28.  
  29. VAR
  30.     FilePath, FileName, GetFiles : NFIO.PathStr;
  31.     dummy : ARRAY [0..66] OF CHAR;
  32.  
  33. PROCEDURE ChoosePath(VAR Name: NFIO.PathStr);
  34. (* Chooses download path if it exists and no other path is specified *)
  35. BEGIN
  36.     IF (QCDefPtr^.DLpath[0] = 0C)
  37.       OR (Pos(Name, '\') # MAX(CARDINAL))
  38.       OR (Pos(Name, ':') # MAX(CARDINAL))
  39.       THEN
  40.          RETURN
  41.     END; (* Use default directory *)
  42.     FilePath := QCDefPtr^.DLpath;
  43.     IF NOT (FilePath[Length(FilePath)-1] IN CHARSET{':','\'}) THEN
  44.          Append(FilePath, '\')
  45.     END;
  46.     Concat(Name, FilePath, Name)
  47. END ChoosePath;
  48.  
  49. PROCEDURE GetFileName;
  50. VAR  OK: BOOLEAN;
  51. BEGIN
  52.    FilePath := '';
  53.    OK := FALSE;
  54.    REPEAT
  55.       IF PromptForString('File to receive (Return to abort): ', FileName) THEN
  56.          ChoosePath (FileName); (* DIAG: TENTATIVE FIX *)
  57.          IF NFIO.Exists(FileName) THEN
  58.                Concat( dummy, FileName, ' Exists. OK to overwrite it?');
  59.                OK := Yes (dummy);
  60.          ELSE
  61.             OK := TRUE
  62.          END
  63.       END
  64.    UNTIL OK OR (FileName[0] = 0C );
  65. END GetFileName;
  66.  
  67. PROCEDURE GetPath;
  68. BEGIN
  69.     FileName[0] := 0C;
  70.     FilePath := QCDefPtr^.DLpath;
  71.     IF (FilePath[0] = 0C) AND NOT PromptForString(
  72. 'Directory to put file in ("." for current; Return to abort):', FilePath ) THEN
  73.          RETURN
  74.     END;
  75.     LOOP
  76.          IF ParsePath( FilePath, NFIO.PathTail(FileName) ) THEN
  77.               IF NOT (FilePath[Length(FilePath)-1] IN CHARSET{':','\'}) THEN
  78.                    Append(FilePath, '\')
  79.               END;
  80.               FileName[0] := 0C;
  81.               RETURN
  82.          ELSIF NOT
  83.             PromptForString(
  84.             'Directory was not valid. Enter directory (Return for current): ',
  85.               FilePath ) THEN
  86.               RETURN
  87.          END
  88.     END
  89. END GetPath;
  90.  
  91. PROCEDURE ReceiveProtocol;
  92. BEGIN
  93.     CASE QCDefPtr^.Protocol OF
  94.          BPlus : RETURN;
  95.         |XModem, XModem1K:
  96.               GetFileName;
  97.               IF FileName[0] = 0C THEN
  98.                    PressKey('Transfer aborted.');
  99.                    RETURN
  100.               END
  101.          ELSE
  102.               GetPath;
  103.               IF FilePath[0] = 0C THEN
  104.                    PressKey('Transfer aborted.');
  105.                    RETURN
  106.               END
  107.     END;
  108.     IF QCDefPtr^.Protocol = Kermit THEN
  109.          IF PromptForString(
  110.               'If connected to "server," files to GET; Otherwise Return: ',
  111.          GetFiles ) THEN END;
  112.          ReceiveKermit( FilePath, GetFiles )
  113.     ELSE
  114.          IF (QCDefPtr^.Protocol IN SimpleXmProtos) AND (FileName[0] = 0C) THEN
  115.               RETURN
  116.          END;
  117.          IF QCDefPtr^.Protocol = ZModem THEN
  118.               ReceiveZmodem( FilePath );
  119.          ELSE
  120.               ReceiveXmodem( FilePath, FileName )
  121.          END
  122.     END;
  123. END ReceiveProtocol;
  124.  
  125. PROCEDURE SendProtocol;
  126. VAR FileList, ThisFile, ThatFile, TempFile: FilePtr;
  127.     BatchFile : NFIO.File;
  128. BEGIN
  129.     CASE QCDefPtr^.Protocol OF
  130.          BPlus : RETURN;
  131.         |XModem, XModem1K:
  132.               dummy := 'Enter file to send or Return to abort: '
  133.          ELSE
  134. dummy := 'Enter file(s) to send or "/" + batch list file or Return to abort: '
  135.     END;
  136.     IF NOT PromptForString(dummy, FileName) THEN
  137.          RETURN
  138.     END;
  139.     IF FileName[0] = '/' THEN
  140.          Delete(FileName, 0, 1);
  141.          BatchFile := NFIO.Open(FileName);
  142.          IF BatchFile = MAX(CARDINAL) THEN
  143.               Concat(dummy, 'Cannot find ', FileName);
  144.               PressKey(dummy);
  145.               RETURN
  146.          END;
  147.          FileList := NIL;
  148.          WHILE NOT NFIO.EOF(BatchFile) DO
  149.               NFIO.RdStr(BatchFile, FileName);
  150.               IF FileName[0] <> 0C THEN
  151.                    IF FileList = NIL THEN
  152.                         FileList := FileTree ( FileName );
  153.                         ThisFile := FileList;
  154.                    ELSE
  155.                         ThisFile^.Next := FileTree ( FileName );
  156.                    END;
  157.                    WHILE (ThisFile <> NIL) AND (ThisFile^.Next <> NIL) DO
  158.                         ThisFile := ThisFile^.Next
  159.                    END
  160.               END
  161.          END;
  162.          NFIO.Close(BatchFile);
  163.          WHILE ThisFile^.Next <> NIL DO (* delete any duplicates *)
  164.               ThatFile := ThisFile;
  165.               WHILE ThatFile^.Next <> NIL DO
  166.                    IF Compare(ThisFile^.Name, ThatFile^.Next^.Name) = 0 THEN
  167.                         TempFile := ThatFile^.Next;
  168.                         ThatFile^.Next := TempFile^.Next;
  169.                         DISPOSE(TempFile)
  170.                    ELSE
  171.                         ThatFile := ThatFile^.Next
  172.                    END;
  173.               END;
  174.               ThisFile := ThisFile^.Next
  175.          END
  176.     ELSE
  177.          FileList := FileTree ( FileName )
  178.     END;
  179.     IF FileList <> NIL THEN
  180.          CASE QCDefPtr^.Protocol OF
  181.               Kermit : SendKermit( FileList );
  182.              |ZModem : SendZmodem( FileList )
  183.                  |ELSE SendXmodem( FileList )
  184.          END;
  185.          UnFileTree( FileList )
  186.     ELSE
  187.          PressKey('No matching files');
  188.     END
  189. END SendProtocol;
  190.  
  191. END QCproto.